using System;
using System.Collections.Generic;

namespace libcharakter
{
	namespace Talente
	{
		namespace Kampf
		{
			[Serializable]
			public class KampfTalent : abTalent
			{
				private bool m_bFernkampf;
				private int m_sParade;
				private int m_sAttacke;

				public bool Fernkampf { get { return m_bFernkampf; } }
				public int Parade { get { return m_sParade; } }
				public int Attacke { get { return m_sAttacke; } }

				public KampfTalent (string name, int value, TableColum col, Charakter charakter, bool fernkampf = false) 
					: base(name, value, TalentType.Kampf, col, charakter)
				{
					m_bFernkampf = fernkampf;

					if (m_bFernkampf) 
					{
                        m_sAttacke = charakter.BasisWerte ["FK-Basiswert"].Value + value;
					} 
					else 
					{
						m_sAttacke = charakter.BasisWerte ["AT-Basiswert"].Value +
							(value % 2 == 0 ? (value / 2) : (value / 2) + 1);
						m_sParade = charakter.BasisWerte ["PA-Basiswert"].Value + 
							(value / 2);
					}

				}
				public bool ModPlusAT ()
				{
					int at = m_sAttacke + 1, pa = m_sParade - 1;

					if(((at - pa) > 3) || ((pa - at) > 3))
						return false;

					m_sAttacke = at;
					m_sParade = pa;

					return true;
				}
				public bool ModMinusAT ()
				{
					int at = m_sAttacke - 1, pa = m_sParade + 1;

					if(((at - pa) > 3) || ((pa - at) > 3))
						return false;

					m_sAttacke = at;
					m_sParade = pa;

					return true;
				}

				public override bool Probe (Eigenschaften eg, int wert1, int wert2, int wert3, int erschwert, ref int rest) { return false; }
			
				public override string ToString ()
				{
					return string.Format ("{0} [{5}*{6}] ({1}): {2} {3} {4}", Name, m_tblColum, BasicValue, Modifikator, Value,
					                      m_sAttacke, m_sParade);
				}
			}
			[Serializable]
			public class Dolche : KampfTalent
			{
				public Dolche (int value, Charakter charakter) : base("Dolche", value, TableColum.D, charakter)
				{
				}
			}
			[Serializable]
			public class Anderhalbhaender : KampfTalent
			{
				public Anderhalbhaender (int value, Charakter charakter) : base("Anderhalbhänder", value, TableColum.E, charakter)
				{
				}
			}
			[Serializable]
			public class Armbrust : KampfTalent
			{
				public Armbrust (int value, Charakter charakter)
					: base("Armbrust", value, TableColum.C, charakter, true)
				{

				}
			}
			[Serializable]
			public class Bogen : KampfTalent
			{
				public Bogen (int value, Charakter charakter) 
					: base("Bogen", value, TableColum.E, charakter, true)
				{

				}
			}
			[Serializable]
			public class Fechtwaffen : KampfTalent
			{
				public Fechtwaffen (int value, Charakter charakter) : base("Fechtwaffen", value, TableColum.E, charakter)
				{
				}
			}
			[Serializable]
			public class Hiebwaffen : KampfTalent
			{
				public Hiebwaffen (int value, Charakter charakter) : base("Hiebwaffen", value, TableColum.D, charakter)
				{
				}
			}
			[Serializable]
			public class Infanteriewaffen : KampfTalent
			{
				public Infanteriewaffen (int value, Charakter charakter) : base("Infanteriewaffen", value, TableColum.D, charakter)
				{
				}
			}
			[Serializable]
			public class Kettenwaffen : KampfTalent
			{
				public Kettenwaffen (int value, Charakter charakter) : base("Kettenwaffen", value, TableColum.D, charakter)
				{
				}
			}
			[Serializable]
			public class Lanzenreiten : KampfTalent
			{
				public Lanzenreiten (int value, Charakter charakter) : base("Lanzenreiten", value, TableColum.E, charakter)
				{
				}
			}
			[Serializable]
			public class Raufen : KampfTalent
			{
				public Raufen (int value, Charakter charakter) : base("Raufen", value, TableColum.C, charakter)
				{
				}
			}
			[Serializable]
			public class Ringen : KampfTalent
			{
				public Ringen (int value, Charakter charakter) : base("Ringen", value, TableColum.D, charakter)
				{
				}
			}
			[Serializable]
			public class Saebel : KampfTalent
			{
				public Saebel (int value, Charakter charakter) : base("Säbel", value, TableColum.D, charakter)
				{
				}
			}
			[Serializable]
			public class Schwerter : KampfTalent
			{
				public Schwerter (int value, Charakter charakter) : base("Schwerter", value, TableColum.E, charakter)
				{
				}
			}
			[Serializable]
			public class Speere : KampfTalent
			{
				public Speere (int value, Charakter charakter) : base("Speere", value, TableColum.D, charakter)
				{
				}
			}
			[Serializable]
			public class Staebe : KampfTalent
			{
				public Staebe (int value, Charakter charakter) : base("Stäbe", value, TableColum.D, charakter)
				{
				}
			}
			[Serializable]
			public class Wurfbeile : KampfTalent
			{
				public Wurfbeile (int value, Charakter charakter) 
					: base("Wurfbeile", value, TableColum.D, charakter, true)
				{

				}
			}
			[Serializable]
			public class Wurfmesser : KampfTalent
			{
				public Wurfmesser (int value, Charakter charakter) 
					: base("Wurfmesser", value, TableColum.C, charakter, true)
				{

				}
			}
			[Serializable]
			public class Wurfspeere : KampfTalent
			{
				public Wurfspeere (int value, Charakter charakter) 
					: base("Wurfspeere", value, TableColum.C, charakter, true)
				{

				}
			}
			[Serializable]
			public class ZweihandHiebfwaffen : KampfTalent
			{
				public ZweihandHiebfwaffen (int value, Charakter charakter) : base("Zweihand Hiebfwaffen", value, TableColum.D, charakter)
				{
				}
			}
			[Serializable]
			public class ZweihandschwerUndSaebel : KampfTalent
			{
				public ZweihandschwerUndSaebel (int value, Charakter charakter) : base("Zweihandschwer Und -säbel", value, TableColum.E, charakter)
				{
				}
			}
		}
	}
}

